找传奇、传世资源到传世资源站!

C# 仿钢琴块 DEMO(小游戏)

8.5玩家评分(1人评分)
下载后可评
介绍 评论 失效链接反馈

模仿钢琴块游戏的实例,目前还没写判断游戏结束的方法但基本不影响使用,关卡文件一同打包到实例里了C# 仿钢琴块 DEMO(小游戏) C#语言基础-第1张C# 仿钢琴块 DEMO(小游戏) C#语言基础-第2张
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;using SimpleMidiPlayer.Midi;using System.IO;namespace 钢琴块_Demo{ public partial class GameControl : Form { public GameControl() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; } #region 控制块的滑落 /// <summary> /// 块滑落的速度(px/2ms) /// </summary> int speed = 5; private void timer1_Tick(object sender, EventArgs e) { try { //遍历控件 foreach (Label l in panel1.Controls) { if (l.Location.Y < 600)//如果控件没出界 l.Location = new Point(l.Location.X, l.Location.Y speed);//滑落 else//否则 GameOver(); } } catch { } try { //遍历控件 foreach (Label l in panel2.Controls) { if (l.Location.Y < 600)//如果控件没出界 l.Location = new Point(l.Location.X, l.Location.Y speed);//滑落 else//否则 GameOver(); } } catch { } try { //遍历控件 foreach (Label l in panel3.Controls) { if (l.Location.Y < 600)//如果控件没出界 l.Location = new Point(l.Location.X, l.Location.Y speed);//滑落 else//否则 GameOver(); } } catch { } try { //遍历控件 foreach (Label l in panel4.Controls) { if (l.Location.Y < 600)//如果控件没出界 l.Location = new Point(l.Location.X, l.Location.Y speed);//滑落 else//否则 GameOver(); } } catch { } } #endregion #region 游戏中的事件 /// <summary> /// 当前已消灭的方块数量 /// </summary> int CurrentBlockCount = 0; int MaxBlockCount = 0; int source = 0; /// <summary> /// 可清除块的区域 /// </summary> Rectangle clearRect = new Rectangle(0, 280, 115, 360); /// <summary> /// 游戏结束 /// </summary> private void GameOver() { timer1.Enabled = Maintimer.Enabled = false; if (MessageBox.Show("游戏结束! 点击确定重玩\n 分数:" source) == System.Windows.Forms.DialogResult.OK) Application.Restart(); } /// <summary> /// 胜利消息 /// </summary> /// <param name="WinMessage"></param> private void YouWin(string WinMessage) { timer1.Enabled = Maintimer.Enabled = false; MessageBox.Show(WinMessage "\n 分数:" source); Application.Restart(); } private MusicDocument doc = new MusicDocument(); /// <summary> /// 播放钢琴简谱 /// </summary> /// <param name="sound">简谱,用/,分隔数字</param> private void PlaySonud(string sound) { doc.MusicScore.Beat = "4/4"; doc.MusicScore.BeatsPerMinute = 80; doc.MusicScore.Mode = "C"; doc.MusicScore.Score = sound "-"; doc.Play(); } private string[] GameLevel; private void StartGame(string level) { //关卡用逗号分隔 GameLevel = File.ReadAllLines(Application.StartupPath "\\Level\\" level ".level"); panel1.Visible = panel2.Visible = panel3.Visible = panel4.Visible = Maintimer.Enabled = true;//开始游戏 } /// <summary> /// 弹出方块 /// </summary> /// <param name="ASDF">方块在哪行</param> /// <param name="sound">发出声音(正数为普通,负数为低音,前面加#为高音)</param>> /// <param name="text">块上的文字</param>> private void OutBlock(int ASDF, string sound = "", string text = "") { Label l = new Label(); l.TextAlign = ContentAlignment.MiddleCenter; if (sound != string.Empty) l.Name = sound; else l.Name = "0"; l.Text = text; l.Cursor = Cursors.Hand; l.Location = new Point(25, -70); l.AutoSize = false; l.ImageAlign = ContentAlignment.MiddleCenter; l.Image = Properties.Resources.noteblock; l.BorderStyle = BorderStyle.FixedSingle; l.BackColor = Color.Black; l.ForeColor = Color.White; l.Size = new Size(70, 70); if (ASDF == 1) { l.Click = (object sender, EventArgs e) => { PlaySonud(sound); source ; panel1.Controls.Remove(l); l.Dispose(); }; panel1.Controls.Add(l); } else if (ASDF == 2) { l.Click = (object sender, EventArgs e) => { PlaySonud(sound); source ; panel2.Controls.Remove(l); l.Dispose(); }; panel2.Controls.Add(l); } else if (ASDF == 3) { l.Click = (object sender, EventArgs e) => { PlaySonud(sound); source ; panel3.Controls.Remove(l); l.Dispose(); }; panel3.Controls.Add(l); } else if (ASDF == 4) { l.Click = (object sender, EventArgs e) => { PlaySonud(sound); source ; panel4.Controls.Remove(l); l.Dispose(); }; panel4.Controls.Add(l); } } int ii = 0; private void Maintimer_Tick(object sender, EventArgs e) { try { if (ii < 1)//如果小于1 { //做准备工作 speed = int.Parse(GameLevel[0].Split(',')[0]);//第一个:速度 ii ; foreach (string str in GameLevel) { if (str.Substring(0, 1) != "0") { MaxBlockCount ; } } timer1.Enabled = true; } else if (ii 1 < GameLevel.Length)//第二个:块数 { string Line = GameLevel[ii].Split(',')[0];//获取在那行 string Sound = GameLevel[ii].Split(',')[1];//获取简谱音符 string BlockText = GameLevel[ii].Split(',')[2];//获取文字 if (Line != "0") OutBlock(int.Parse(Line), Sound, BlockText);//弹出块 else PlaySonud(Sound); ii ; } } catch { timer1.Enabled = Maintimer.Enabled = false; MessageBox.Show("关卡文件有毒...请使用正确的关卡文件","(⊙o⊙)…"); } } private void Form1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.A) { if (panel1.Controls.Count == 0) GameOver(); int SurplusCount = 0;//剩余项目 foreach (Label l in panel1.Controls)//遍历控件 { //控件工作区域 Rectangle a = new Rectangle(l.Location.X, l.Location.Y, l.Width, l.Height); if (clearRect.Contains(a))//如果控件在工作区域内 { PlaySonud(l.Name); panel1.Controls.Remove(l);//移除控件 l.Dispose();//释放控件的资源 source ;//分数 1 CurrentBlockCount ; } else SurplusCount ;//否则剩余项目 1 } if (CurrentBlockCount == MaxBlockCount) YouWin("恭喜你通过关卡"); } else if (e.KeyCode == Keys.S) { if (panel2.Controls.Count == 0) GameOver(); int SurplusCount = 0;//剩余项目 foreach (Label l in panel2.Controls)//遍历控件 { //控件工作区域 Rectangle a = new Rectangle(l.Location.X, l.Location.Y, l.Width, l.Height); if (clearRect.Contains(a))//如果控件在工作区域内 { PlaySonud(l.Name); panel2.Controls.Remove(l);//移除控件 l.Dispose();//释放控件的资源 source ;//分数 1 CurrentBlockCount ; } else SurplusCount ;//否则剩余项目 1 } if (CurrentBlockCount == MaxBlockCount) YouWin("恭喜你通过关卡"); } else if (e.KeyCode == Keys.D) { if (panel3.Controls.Count == 0) GameOver(); int SurplusCount = 0;//剩余项目 foreach (Label l in panel3.Controls)//遍历控件 { //控件工作区域 Rectangle a = new Rectangle(l.Location.X, l.Location.Y, l.Width, l.Height); if (clearRect.Contains(a))//如果控件在工作区域内 { PlaySonud(l.Name); panel3.Controls.Remove(l);//移除控件 l.Dispose();//释放控件的资源 source ;//分数 1 CurrentBlockCount ; } else SurplusCount ;//否则剩余项目 1 } if (CurrentBlockCount == MaxBlockCount) YouWin("恭喜你通过关卡"); } else if (e.KeyCode == Keys.F) { if (panel4.Controls.Count == 0) GameOver(); int SurplusCount = 0;//剩余项目 foreach (Label l in panel4.Controls)//遍历控件 { //控件工作区域 Rectangle a = new Rectangle(l.Location.X, l.Location.Y, l.Width, l.Height); if (clearRect.Contains(a))//如果控件在工作区域内 { PlaySonud(l.Name); panel4.Controls.Remove(l);//移除控件 l.Dispose();//释放控件的资源 source ;//分数 1 CurrentBlockCount ; } else SurplusCount ;//否则剩余项目 1 } if (CurrentBlockCount == MaxBlockCount) YouWin("恭喜你通过关卡"); } } #endregion /// <summary> /// 直接点击面板 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void panel4_Click(object sender, EventArgs e) { //游戏结束 GameOver(); } private void button1_Click_1(object sender, EventArgs e) { //button1.Enabled = button3.Enabled = false; this.panel5.Location = new System.Drawing.Point(189, 143); button2.Focus(); panel5.Visible = true; DirectoryInfo d = new DirectoryInfo(Application.StartupPath "\\Level\\"); foreach(FileInfo f in d.GetFiles("*.level")) { listBox1.Items.Add(Path.GetFileName(f.FullName).Substring(0, Path.GetFileName(f.FullName).LastIndexOf('.'))); } listBox1.SelectedIndex = 0; } private void button2_Click(object sender, EventArgs e) { if (listBox1.SelectedItem.ToString().Trim() != string.Empty) { Controls.Remove(panel5); this.MainPanel.Location = new System.Drawing.Point(87, 12); MainPanel.Visible = true; StartGame(listBox1.SelectedItem.ToString()); } } private void button3_Click(object sender, EventArgs e) { MessageBox.Show("可以使用键盘 A S D F 键分别消除4排的方块,也可以用鼠标点击方块消除"); } }}

评论

发表评论必须先登陆, 您可以 登陆 或者 注册新账号 !


在线咨询: 问题反馈
客服QQ:174666394

有问题请留言,看到后及时答复